package com.qmds.common.core.utils;

import java.util.Random;

import java.util.Random;

public class CodeGeneratorUtils {

    // 定义大写字母字符串
    private static final String LETTERS_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // 定义小写字母字符串
    private static final String LETTERS_LOWER = "abcdefghijklmnopqrstuvwxyz";
    // 定义数字字符串
    private static final String DIGITS = "0123456789";

    /**
     * 生成指定长度和大小写类型的代码字符串
     *
     * @param pLen 代码中字母部分的长度
     * @param len 代码中字母数字混合部分的长度
     * @param isLowerCase 是否生成小写字母代码
     * @return 生成的代码字符串
     * @throws IllegalArgumentException 如果pLen或len不是正整数
     */
    public static String generateCode(int pLen, int len, boolean isLowerCase) {
        // 参数校验
        if (pLen <= 0 || len <= 0) {
            throw new IllegalArgumentException("pLen 和 len 都必须是正整数");
        }

        // 创建StringBuilder用于构建最终的代码字符串
        StringBuilder stringBuilder = new StringBuilder(pLen + len + 1);

        // 使用局部变量Random生成随机数
        Random random = new Random();

        // 根据isLowerCase决定使用大写字母还是小写字母
        String letters = isLowerCase ? LETTERS_LOWER : LETTERS_UPPER;

        // 生成字母部分的随机代码
        for (int i = 0; i < pLen; i++) {
            stringBuilder.append(letters.charAt(random.nextInt(letters.length())));
        }

        // 添加分隔符
        stringBuilder.append('-');

        // 生成字母数字混合部分的随机代码
        stringBuilder.append(generateRandomAlphanumeric(len, isLowerCase));

        // 返回构建好的代码字符串
        return stringBuilder.toString();
    }

    /**
     * 生成随机的字母和数字混合的字符串
     *
     * @param len 字符串的长度
     * @param isLowerCase 是否生成小写字母字符串
     * @return 生成的字母数字混合字符串
     * @throws IllegalArgumentException 如果len不是正整数
     */
    private static String generateRandomAlphanumeric(int len, boolean isLowerCase) {
        // 参数校验
        if (len <= 0) {
            throw new IllegalArgumentException("len 必须为正整数");
        }

        // 创建StringBuilder用于构建随机字符串
        StringBuilder stringBuilder = new StringBuilder(len);
        // 根据isLowerCase决定使用大写字母还是小写字母
        String letters = isLowerCase ? LETTERS_LOWER : LETTERS_UPPER;
        // 组合字母和数字字符集
        String combinedChars = letters + DIGITS;
        // 使用局部变量Random生成随机数
        Random random = new Random();

        // 生成随机字符串
        for (int i = 0; i < len; i++) {
            stringBuilder.append(combinedChars.charAt(random.nextInt(combinedChars.length())));
        }
        // 返回生成的随机字符串
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        try {
            // 示例：生成并打印小写字母代码
            System.out.println(generateCode(2, 1, true));
            // 示例：生成并打印大写字母代码
            System.out.println(generateCode(2, 1, false));
        } catch (IllegalArgumentException e) {
            // 处理非法参数异常
            System.err.println("Error: " + e.getMessage());
        }
    }
}
